From: kfraser@localhost.localdomain Date: Wed, 19 Sep 2007 08:24:20 +0000 (+0100) Subject: PCI passthru various Xen changes. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14937^2~69 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=92099a3c2dc55c2c90295ceade1da45078a24140;p=xen.git PCI passthru various Xen changes. Signed-off-by: Allen Kay Signed-off-by: Guy Zana --- diff --git a/xen/arch/x86/acpi/boot.c b/xen/arch/x86/acpi/boot.c index f3ce4119df..ba308687ac 100644 --- a/xen/arch/x86/acpi/boot.c +++ b/xen/arch/x86/acpi/boot.c @@ -1017,5 +1017,7 @@ int __init acpi_boot_init(void) acpi_table_parse(ACPI_HPET, acpi_parse_hpet); + acpi_dmar_init(); + return 0; } diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index 0e036cbc17..795c71a727 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -216,11 +216,11 @@ int hvm_domain_initialise(struct domain *d) spin_lock_init(&d->arch.hvm_domain.pbuf_lock); spin_lock_init(&d->arch.hvm_domain.irq_lock); - rc = iommu_domain_init(d); + rc = paging_enable(d, PG_refcounts|PG_translate|PG_external); if ( rc != 0 ) return rc; - rc = paging_enable(d, PG_refcounts|PG_translate|PG_external); + rc = iommu_domain_init(d); if ( rc != 0 ) return rc; @@ -230,7 +230,11 @@ int hvm_domain_initialise(struct domain *d) hvm_init_ioreq_page(d, &d->arch.hvm_domain.ioreq); hvm_init_ioreq_page(d, &d->arch.hvm_domain.buf_ioreq); - return hvm_funcs.domain_initialise(d); + rc = hvm_funcs.domain_initialise(d); + if ( rc != 0 ) + release_devices(d); + + return rc; } void hvm_domain_relinquish_resources(struct domain *d) @@ -246,6 +250,7 @@ void hvm_domain_relinquish_resources(struct domain *d) void hvm_domain_destroy(struct domain *d) { + release_devices(d); hvm_funcs.domain_destroy(d); } diff --git a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c index 75c6afabbe..67175b2f81 100644 --- a/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c +++ b/xen/arch/x86/hvm/vmx/vtd/intel-iommu.c @@ -35,12 +35,6 @@ #include "msi.h" #define VTDPREFIX -static inline int request_irq(int vector, void *func, - int flags, char *name, void *data) -{ - return -ENOSYS; -} - extern void print_iommu_regs(struct acpi_drhd_unit *drhd); extern void print_vtd_entries(struct domain *d, int bus, int devfn, unsigned long gmfn); @@ -1676,7 +1670,7 @@ int iommu_setup(void) struct acpi_drhd_unit *drhd; struct iommu *iommu; - if (list_empty(&acpi_drhd_units)) + if (!vtd_enabled) return 0; INIT_LIST_HEAD(&hd->pdev_list); diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index 8dbaed5957..b7136157d0 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -16,6 +16,7 @@ #include #include #include +#include /* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */ int opt_noirqbalance = 0; @@ -98,6 +99,39 @@ asmlinkage void do_IRQ(struct cpu_user_regs *regs) spin_unlock(&desc->lock); } +int request_irq(unsigned int irq, + void (*handler)(int, void *, struct cpu_user_regs *), + unsigned long irqflags, const char * devname, void *dev_id) +{ + struct irqaction * action; + int retval; + + /* + * Sanity-check: shared interrupts must pass in a real dev-ID, + * otherwise we'll have trouble later trying to figure out + * which interrupt is which (messes up the interrupt freeing + * logic etc). + */ + if (irq >= NR_IRQS) + return -EINVAL; + if (!handler) + return -EINVAL; + + action = xmalloc(struct irqaction); + if (!action) + return -ENOMEM; + + action->handler = handler; + action->name = devname; + action->dev_id = dev_id; + + retval = setup_irq(irq, action); + if (retval) + xfree(action); + + return retval; +} + void free_irq(unsigned int irq) { unsigned int vector = irq_to_vector(irq); @@ -203,7 +237,9 @@ static void __do_IRQ_guest(int vector) if ( (action->ack_type != ACKTYPE_NONE) && !test_and_set_bit(irq, d->pirq_mask) ) action->in_flight++; - send_guest_pirq(d, irq); + if (!hvm_do_IRQ_dpci(d, irq)) + send_guest_pirq(d, irq); + } } diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 94b66e2950..a4fa6190b9 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -1038,6 +1038,8 @@ void __init __start_xen(unsigned long mbi_p) _initrd_len = mod[initrdidx].mod_end - mod[initrdidx].mod_start; } + iommu_setup(); + /* * We're going to setup domain0 using the module(s) that we stashed safely * above our heap. The second module, if present, is an initrd ramdisk. diff --git a/xen/include/xen/irq.h b/xen/include/xen/irq.h index b92f785b94..392fd2108f 100644 --- a/xen/include/xen/irq.h +++ b/xen/include/xen/irq.h @@ -64,6 +64,9 @@ extern irq_desc_t irq_desc[NR_IRQS]; extern int setup_irq(unsigned int, struct irqaction *); extern void free_irq(unsigned int); +extern int request_irq(unsigned int irq, + void (*handler)(int, void *, struct cpu_user_regs *), + unsigned long irqflags, const char * devname, void *dev_id); extern hw_irq_controller no_irq_type; extern void no_action(int cpl, void *dev_id, struct cpu_user_regs *regs);